package cn.iocoder.yudao.module.lowcode.core.datasource;

import cn.iocoder.yudao.module.infra.dal.dataobject.db.InfraDataSourceConfigDO;
import cn.iocoder.yudao.module.lowcode.dal.dataobject.datasource.LowcodeDataSourceConfigDO;
import cn.iocoder.yudao.module.lowcode.service.datasource.LowcodeDataSourceConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 低代码数据源适配器
 * 
 * 为了兼容代码生成器等依赖infra数据源配置的功能，
 * 提供从lowcode数据源配置到infra数据源配置的适配
 *
 * @author 芋道源码
 */
@Component
@Slf4j
public class LowcodeDataSourceAdapter {

    @Resource
    private LowcodeDataSourceConfigService lowcodeDataSourceConfigService;

    /**
     * 将低代码数据源配置适配为infra数据源配置
     * 主要用于代码生成器等场景
     *
     * @param dataSourceConfigId 数据源配置ID
     * @return infra数据源配置（适配结果）
     */
    public InfraDataSourceConfigDO adaptToInfraDataSourceConfig(Long dataSourceConfigId) {
        try {
            // 获取低代码数据源配置
            LowcodeDataSourceConfigDO lowcodeConfig = lowcodeDataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
            if (lowcodeConfig == null) {
                log.warn("[adaptToInfraDataSourceConfig] 低代码数据源配置不存在: {}", dataSourceConfigId);
                return null;
            }

            // 适配为infra数据源配置
            InfraDataSourceConfigDO infraConfig = new InfraDataSourceConfigDO();
            infraConfig.setId(lowcodeConfig.getId());
            infraConfig.setName(lowcodeConfig.getName());
            infraConfig.setUrl(lowcodeConfig.getUrl());
            infraConfig.setUsername(lowcodeConfig.getUsername());
            infraConfig.setPassword(lowcodeConfig.getPassword());

            log.debug("[adaptToInfraDataSourceConfig] 数据源适配成功: id={}, name={}", 
                    infraConfig.getId(), infraConfig.getName());

            return infraConfig;

        } catch (Exception e) {
            log.error("[adaptToInfraDataSourceConfig] 数据源适配失败: dataSourceConfigId={}", dataSourceConfigId, e);
            return null;
        }
    }

    /**
     * 检查指定ID的数据源配置是否存在
     *
     * @param dataSourceConfigId 数据源配置ID
     * @return 是否存在
     */
    public boolean existsDataSourceConfig(Long dataSourceConfigId) {
        try {
            LowcodeDataSourceConfigDO config = lowcodeDataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
            return config != null;
        } catch (Exception e) {
            log.error("[existsDataSourceConfig] 检查数据源配置存在性失败: dataSourceConfigId={}", dataSourceConfigId, e);
            return false;
        }
    }

}